package com.geo.auth.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Sa-Token权限认证配置
 * 
 * @author GEO Team
 * @version 1.0
 */
@Slf4j
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
    
    private static final Logger log = LoggerFactory.getLogger(SaTokenConfig.class);
    
    /**
     * 注册Sa-Token拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 登录校验：除了登录接口，都需要登录才能访问
            SaRouter.match("/**")
                    .notMatch("/api/auth/login")
                    .notMatch("/api/auth/register") 
                    .notMatch("/api/auth/captcha")
                    .notMatch("/api/auth/forgot-password")
                    .notMatch("/api/health")
                    .notMatch("/doc.html")
                    .notMatch("/webjars/**")
                    .notMatch("/favicon.ico")
                    .notMatch("/v2/api-docs")
                    .notMatch("/swagger-resources/**")
                    .notMatch("/static/**")
                    .notMatch("/public/**")
                    .check(r -> StpUtil.checkLogin());
            
            // 权限校验：不同的接口需要不同的权限
            
            // 商家管理权限
            SaRouter.match("/api/merchants/**")
                    .check(r -> StpUtil.checkPermission("merchant:manage"));
            
            // 关键词管理权限
            SaRouter.match("/api/keywords/**")
                    .check(r -> StpUtil.checkPermission("keyword:manage"));
            
            // 内容管理权限
            SaRouter.match("/api/content/**")
                    .check(r -> StpUtil.checkPermission("content:manage"));
            
            // AI模型管理权限
            SaRouter.match("/api/ai/**")
                    .check(r -> StpUtil.checkPermission("ai:manage"));
            
            // 系统管理权限
            SaRouter.match("/api/system/**")
                    .check(r -> StpUtil.checkPermission("system:manage"));
            
            // 角色管理权限
            SaRouter.match("/api/roles/**")
                    .check(r -> StpUtil.checkRole("admin"));
            
            // 用户管理权限
            SaRouter.match("/api/users/**")
                    .check(r -> StpUtil.checkRole("admin"));
            
            // 权限管理权限
            SaRouter.match("/api/permissions/**")
                    .check(r -> StpUtil.checkRole("admin"));
            
            // 文件上传权限
            SaRouter.match("/api/files/**")
                    .check(r -> StpUtil.checkPermission("file:upload"));
            
            // 数据统计权限
            SaRouter.match("/api/analytics/**")
                    .check(r -> StpUtil.checkPermission("analytics:view"));
            
            // 监控数据权限
            SaRouter.match("/api/monitoring/**")
                    .check(r -> StpUtil.checkPermission("monitoring:view"));
            
            log.debug("Sa-Token权限校验通过");
            
        })).addPathPatterns("/**");
    }
}